"""
定义一个个算法，把它们封装起来，并且使它们可以相互替换。本模式使得算法可独立于使用它的客户而变化.

角色：
    抽象策略（Strategy）
    具体策略（ConcreteStrategy）
    上下文（Context）

其实就是：
    1、创建一个抽象策略
    2、创建多个具体策略，（表示多个算法）
    3、在上下文中执行或者切换
"""
from abc import abstractmethod, ABCMeta


# 抽象策略
class Strategy(metaclass=ABCMeta):
    @abstractmethod
    def execute(self, data):
        pass


# 具体策略
class FastStrategy(Strategy):
    def execute(self, data):
        print("使用较快的策略处理%s" % data)


# 具体策略
class SlowStrategy(Strategy):
    def execute(self, data):
        print("使用较慢的策略处理%s" % data)


# 上下文
class Context:
    def __init__(self, data, strategy):
        self.data = data
        self.strategy = strategy

    def set_strategy(self, strategy):
        """切换"""
        self.strategy = strategy

    def do_strategy(self):
        """执行"""
        self.strategy.execute(self.data)


data = "Hello!"
# 使用较快的策略处理
fast_strategy = FastStrategy()
context = Context(data,fast_strategy,)
context.do_strategy()

# 使用较慢的策略处理
slow_strategy = SlowStrategy()
context.set_strategy(slow_strategy)  # 切换策略
# context = Context(data,fast_strategy,)
context.do_strategy()
